/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Modelo.PersistenciaJDBC;


import Modelo.Entidades.Alumno;
import Modelo.Entidades.Pregunta;
import Modelo.Entidades.PreguntaImpl;
import Modelo.Entidades.Respuesta;
import Modelo.Entidades.RespuestaImpl;
import Modelo.Entidades.Tarea;
import Modelo.Entidades.TareaImpl;
import Modelo.Persistencia.TareaDAO;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/*
 *  Proyecto eJAM [G12]
 *  Miembros:
 *      - Javier Ruiz Hidalgo
 *      - Adrian Ramos Cápitas
 *      - Miguel Alejandro Esteban Ordóñez
 */

public class TareaDAOJDBC implements TareaDAO{

    public void create(Tarea entidad) {
        String sqlR = "INSERT INTO RESPUESTA(NOMBRE, NUM_P, NUM_R, DESCRIPCION) VALUES (?,?,?,?)";
        String sqlP = "INSERT INTO PREGUNTA(NOMBRE, NUM_P, DESCRIPCION, R_CORRECTA) VALUES (?,?,?,?)";
        String sqlT = "INSERT INTO TAREA(NOMBRE,TIPO,DURACION,F_FIN,F_INI,C_ERROR) VALUES (?,?,?,?,?,?)";
        String sqlTi = "INSERT INTO TIENE(DNI, NOMBRE) VALUES (?,?)";
        
        List<Alumno> alumnos = null;

        try {
            //Introducción de Informacion en la tabla TAREA
            PreparedStatement stm = Persistencia.createConnection().prepareStatement(sqlT);
            stm.setString(1, entidad.getNombre());
            stm.setString(2, entidad.getTipo());
            stm.setTime(3, entidad.getDuracion());
            java.sql.Timestamp timestamp1 = new java.sql.Timestamp(entidad.getF_fin().getTime());
            stm.setTimestamp(4, timestamp1);
            java.sql.Timestamp timestamp2 = new java.sql.Timestamp(entidad.getF_ini().getTime());
            stm.setTimestamp(5, timestamp2);
            stm.setDouble(6, entidad.getC_error());
            stm.execute();

            //Introducción de Informacion en la tabla PREGUNTA
            for(Pregunta p: entidad.getPreguntas()){
                stm = Persistencia.createConnection().prepareStatement(sqlP);
                stm.setString(1, entidad.getNombre());
                stm.setInt(2, p.getNumP());
                stm.setString(3, p.getDescripcion());
                stm.setInt(4, p.getrCorrecta());
                stm.execute();

                //Introducción de Informacion en la tabla RESPUESTA
                for(Respuesta r: p.getRespuestas()){
                    stm = Persistencia.createConnection().prepareStatement(sqlR);
                    stm.setString(1, entidad.getNombre());
                    stm.setInt(2, p.getNumP());
                    stm.setInt(3, r.getNumR());
                    stm.setString(4, r.getDescripcion());
                    stm.execute();
                }

            }

            alumnos = new UsuarioDAOJDBC().listarAlumnos();

            //Introducción de Informacion en la tabla TIENE
            for(Alumno a: alumnos){
                stm = Persistencia.createConnection().prepareStatement(sqlTi);
                stm.setString(1, a.getDNI());
                stm.setString(2, entidad.getNombre());
                stm.execute();
            }


        } catch (SQLException e) {
            System.out.println(e);
        } finally {
            Persistencia.closeConnection();
        }
    }

    public Tarea read(String pk) {
        Tarea t = null;
        Pregunta pregunta = null;
        Respuesta respuesta = null;

        try {
            Statement stmt = Persistencia.createConnection().createStatement();
            ResultSet resP, resR, resT = stmt.executeQuery("SELECT * FROM TAREA WHERE NOMBRE = '" +pk+ "'");
            String nombre, tipo, descripcion1, descripcion2;
            Time duracion;
            int numP, numR, rCorrecta;
            Date f_fin, f_ini;
            double c_error;

            if (resT.next()) {
                nombre = resT.getString("NOMBRE");
                tipo = resT.getString("TIPO");
                duracion = resT.getTime("DURACION");
                f_fin = new Date(resT.getTimestamp("F_FIN").getTime());
                f_ini = new Date(resT.getTimestamp("F_INI").getTime());
                c_error = resT.getDouble("C_ERROR");
                t = new TareaImpl(nombre, tipo, duracion, f_fin, f_ini, c_error);

                resP = stmt.executeQuery("SELECT * FROM PREGUNTA WHERE NOMBRE = '" +t.getNombre()+ "'");
                while (resP.next()) {
                    numP = resP.getInt("NUM_P");
                    descripcion1 = resP.getString("DESCRIPCION");
                    rCorrecta = resP.getInt("R_CORRECTA");
                    pregunta = new PreguntaImpl(numP, descripcion1, rCorrecta);
                    t.getPreguntas().add(pregunta);
                }

                for(Pregunta p: t.getPreguntas()){
                    resR = stmt.executeQuery("SELECT * FROM RESPUESTA WHERE NOMBRE = '" +t.getNombre()+ "' AND NUM_P = '" +p.getNumP()+"'");
                    while (resR.next()) {
                        numR = resR.getInt("NUM_R");
                        descripcion2 = resR.getString("DESCRIPCION");
                        respuesta = new RespuestaImpl(numR, descripcion2);
                        p.addRespuesta(respuesta);
                    }
                }
            }

        } catch (SQLException e) {
            System.out.println(e);
        } finally {
            Persistencia.closeConnection();
        }

        return t;
    }

    public void update(Tarea entidad) {
        //Metodo no contemplado
    }

    public void delete(Tarea entidad) {
        try {
            Statement stmt = Persistencia.createConnection().createStatement();
            stmt.executeUpdate("DELETE FROM RESPUESTA_CONTESTADA WHERE NOMBRE = '" +entidad.getNombre()+ "'");
            stmt.executeUpdate("DELETE FROM TAREA_REALIZADA WHERE NOMBRE = '" +entidad.getNombre()+ "'");
            stmt.executeUpdate("DELETE FROM TIENE WHERE NOMBRE = '" +entidad.getNombre()+ "'");
            stmt.executeUpdate("DELETE FROM RESPUESTA WHERE NOMBRE = '" +entidad.getNombre()+ "'");
            stmt.executeUpdate("DELETE FROM PREGUNTA WHERE NOMBRE = '" +entidad.getNombre()+ "'");
            stmt.executeUpdate("DELETE FROM TAREA WHERE NOMBRE = '" +entidad.getNombre()+ "'");
        } catch (SQLException e) {
            System.out.println(e);
        } finally {
            Persistencia.closeConnection();
        }
    }

    public List<Tarea> list() {
        List<Tarea> tareas = new ArrayList<Tarea>();
        Tarea tarea;
        Pregunta pregunta;
        Respuesta respuesta;

        try {
            Statement stmt = Persistencia.createConnection().createStatement();
            ResultSet resP, resR, resT;
            String nombre, tipo, descripcion1, descripcion2;
            Time duracion;
            int numP, numR, rCorrecta;
            Date f_fin, f_ini;
            double c_error;

            resT = stmt.executeQuery("SELECT * FROM TAREA");
            while (resT.next()) {
                nombre = resT.getString("NOMBRE");
                duracion = resT.getTime("DURACION");
                tipo = resT.getString("TIPO");
                f_fin = new Date(resT.getTimestamp("F_FIN").getTime());
                f_ini = new Date(resT.getTimestamp("F_INI").getTime());
                c_error = resT.getDouble("C_ERROR");
                tarea = new TareaImpl(nombre, tipo, duracion, f_fin, f_ini, c_error);
                tareas.add(tarea);
            }

            for(Tarea t: tareas){
                resP = stmt.executeQuery("SELECT * FROM PREGUNTA WHERE NOMBRE = '" +t.getNombre()+ "'");
                while (resP.next()) {
                    numP = resP.getInt("NUM_P");
                    descripcion1 = resP.getString("DESCRIPCION");
                    rCorrecta = resP.getInt("R_CORRECTA");
                    pregunta = new PreguntaImpl(numP, descripcion1, rCorrecta);
                    t.getPreguntas().add(pregunta);
                }

                for(Pregunta p: t.getPreguntas()){
                    resR = stmt.executeQuery("SELECT * FROM RESPUESTA WHERE NOMBRE = '" +t.getNombre()+ "' AND NUM_P = '" +p.getNumP()+"'");
                    while (resR.next()) {
                        numR = resR.getInt("NUM_R");
                        descripcion2 = resR.getString("DESCRIPCION");
                        respuesta = new RespuestaImpl(numR, descripcion2);
                        p.addRespuesta(respuesta);
                    }
                }
            }

        } catch (SQLException e) {
            System.out.println(e);
        } finally {
            Persistencia.closeConnection();
        }
        return tareas;
    }

    public List<Tarea> listByDNI(String DNI) {
        List<Tarea> tareas = new ArrayList<Tarea>();
        Tarea tarea;
        Pregunta pregunta;
        Respuesta respuesta;

        try {
            Statement stmt = Persistencia.createConnection().createStatement();
            ResultSet resR, resP, resT;
            String nombre, tipo, descripcion1, descripcion2;
            Time duracion;
            int numP, numR, rCorrecta;
            Date f_fin, f_ini;
            double c_error;

            resT = stmt.executeQuery("SELECT * FROM TAREA T, TIENE TI WHERE T.NOMBRE=TI.NOMBRE AND TI.DNI = '" +DNI+ "'");
            while (resT.next()) {
                nombre = resT.getString("NOMBRE");
                duracion = resT.getTime("DURACION");
                tipo = resT.getString("TIPO");
                f_fin = new Date(resT.getTimestamp("F_FIN").getTime());
                f_ini = new Date(resT.getTimestamp("F_INI").getTime());
                c_error = resT.getDouble("C_ERROR");
                tarea = new TareaImpl(nombre, tipo, duracion, f_fin, f_ini, c_error);
                tareas.add(tarea);
            }

            for(Tarea t: tareas){
                resP = stmt.executeQuery("SELECT * FROM PREGUNTA WHERE NOMBRE = '" +t.getNombre()+ "'");
                while (resP.next()) {
                    numP = resP.getInt("NUM_P");
                    descripcion1 = resP.getString("DESCRIPCION");
                    rCorrecta = resP.getInt("R_CORRECTA");
                    pregunta = new PreguntaImpl(numP, descripcion1, rCorrecta);
                    t.getPreguntas().add(pregunta);
                }

                for(Pregunta p: t.getPreguntas()){
                    resR = stmt.executeQuery("SELECT * FROM RESPUESTA WHERE NOMBRE = '" +t.getNombre()+ "' AND NUM_P = '" +p.getNumP()+"'");
                    while (resR.next()) {
                        numR = resR.getInt("NUM_R");
                        descripcion2 = resR.getString("DESCRIPCION");
                        respuesta = new RespuestaImpl(numR, descripcion2);
                        p.addRespuesta(respuesta);
                    }
                }
            }

        } catch (SQLException e) {
            System.out.println(e);
        } finally {
            Persistencia.closeConnection();
        }
        return tareas;
    }

    public boolean compruebaNombre(String nombre) {
        boolean confirmacion = false;

        try {
            Statement stmt = Persistencia.createConnection().createStatement();
            ResultSet res = stmt.executeQuery("SELECT * FROM TAREA T WHERE T.NOMBRE = '"+nombre+"'");

            if (res.next()) {
                confirmacion = true;
            }

        } catch (SQLException e) {
            System.out.println(e);
        } finally {
            Persistencia.closeConnection();
        }

        return confirmacion;
    }

    public List<Tarea> listByTipo(String tipo) {
        List<Tarea> tareas = new ArrayList<Tarea>();
        Tarea tarea;
        Pregunta pregunta;
        Respuesta respuesta;

        try {
            Statement stmt = Persistencia.createConnection().createStatement();
            ResultSet resP, resR, resT;
            String nombre, descripcion1, descripcion2;
            Time duracion;
            int numP, numR, rCorrecta;
            Date f_fin, f_ini;
            double c_error;

            resT = stmt.executeQuery("SELECT * FROM TAREA WHERE TIPO = '" +tipo+ "'");
            while (resT.next()) {
                nombre = resT.getString("NOMBRE");
                duracion = resT.getTime("DURACION");
                f_fin = new Date(resT.getTimestamp("F_FIN").getTime());
                f_ini = new Date(resT.getTimestamp("F_INI").getTime());
                c_error = resT.getDouble("C_ERROR");
                tarea = new TareaImpl(nombre, tipo, duracion, f_fin, f_ini, c_error);
                tareas.add(tarea);
            }

            for(Tarea t: tareas){
                resP = stmt.executeQuery("SELECT * FROM PREGUNTA WHERE NOMBRE = '" +t.getNombre()+ "'");
                while (resP.next()) {
                    numP = resP.getInt("NUM_P");
                    descripcion1 = resP.getString("DESCRIPCION");
                    rCorrecta = resP.getInt("R_CORRECTA");
                    pregunta = new PreguntaImpl(numP, descripcion1, rCorrecta);
                    t.getPreguntas().add(pregunta);
                }

                for(Pregunta p: t.getPreguntas()){
                    resR = stmt.executeQuery("SELECT * FROM RESPUESTA WHERE NOMBRE = '" +t.getNombre()+ "' AND NUM_P = '" +p.getNumP()+"'");
                    while (resR.next()) {
                        numR = resR.getInt("NUM_R");
                        descripcion2 = resR.getString("DESCRIPCION");
                        respuesta = new RespuestaImpl(numR, descripcion2);
                        p.addRespuesta(respuesta);
                    }
                }
            }

        } catch (SQLException e) {
            System.out.println(e);
        } finally {
            Persistencia.closeConnection();
        }
        return tareas;
    }

}
